/**
 * @ 6.1.5 访问权限
 * 1）说明
 * 在Java 中，访问权限分为：public，private，protected 和默认。在 Scala 中，你可以通过类似的修饰符达到同样的效果。但是使用上有区别。
 * （1）Scala 中属性和方法的默认访问权限为public，但Scala中无public关键字。
 * （2）private 为私有权限，只在类的内部和伴生对象中可用。
 * （3）protected 为受保护权限，Scala 中受保护权限比 Java 中更严格，同类、子类可以访问，同包无法访问。
 * （4）private[包名]增加包访问权限，包名下的其他类也可以使用
 * */
//class Person {
//
//  private var name: String = "bobo"
//  protected var age: Int = 18
//  private var sex: String = "男"
//
//  def say(): Unit = {
//    println(name)
//  }
//}
//
//
//object Person {
//
//  def main(args: Array[String]): Unit = {
//
//    /**
//     * 创建对象：
//     * （1）val 修饰对象，不能改变对象的引用（即：内存地址），可以改变对象属性的值。
//     * （2）var 修饰对象，可以修改对象的引用和修改对象的属性值
//     * （3）自动推导变量类型不能多态，所以多态需要显示声明
//     * */
//    val person = new Person
//
//    person.say()
//
//    println(person.name)
//
//    println(person.age)
//  }
//}

/**
 * @ 6.2.5 构造器
 * （1）辅助构造器，函数的名称 this，可以有多个，编译器通过参数的个数及类型来区分。
 * （2）辅助构造方法不能直接构建对象，必须直接或者间接调用主构造方法。
 * （3）构造器调用其他另外的构造器，要求被调用构造器必须提前声明。
 * （4）如果主构造器无参数，小括号可省略，构建对象时调用的构造方法的小括号也可以省略。
 * */
//（1）如果主构造器无参数，小括号可省略
//class Person (){
class Person {
  var name: String = _
  var age: Int = _


  def this(age: Int) {
    this()
    this.age = age
    println("辅助构造器")
  }

  def this(age: Int, name: String) {
    this(age)
    this.name = name
    println("主构造器")
  }

}

object Person {

  def main(args: Array[String]): Unit = {

    val person2 = new Person(18,"安森泰")
    println(person2.age + " " + person2.name)
  }
}


//class Person {
//
//  var name: String = "bobo" //定义属性
//
//  var age: Int = _ // _表示给属性一个默认值
//
//  //Bean属性（@BeanProperty）
//  @BeanProperty var sex: String = "男"
//
//  /** val修饰的属性不能赋默认值，必须显示指定 */
//}
//
//object Person {
//  def main(args: Array[String]): Unit = {
//
//    var person = new Person()
//    println(person.name)
//
//    person.setSex("女")
//    println(person.getSex)
//  }
//}
